/*
 * Textura.cpp
 *
 *  Created on: 10/11/2009
 *      Author: ale
 */

#include "Textura.h"
#include <SDL/SDL_image.h>
#include <iostream>
using namespace std;

Textura::Textura(){
	textura = 0;
}

bool Textura::load(string url) {
	SDL_Surface* surface;
	GLenum formato;
	GLint  cantColores;
	if ((surface = IMG_Load(url.c_str()))) {
		// cantidad de canales de color de la imagen
		cantColores = surface->format->BytesPerPixel;
		if (cantColores == 4) { // el 4 es el canal alpha
			if (surface->format->Rmask == 0x000000ff){
				formato = GL_RGBA;
			}
			else{
				formato = GL_BGRA;
			}
		} else if (cantColores == 3) // no alpha channel
		{
			if (surface->format->Rmask == 0x000000ff) {
				formato = GL_RGB;
			} else {
				formato = GL_BGR;
			}
		} else {
			cout<<"ERROR"<<endl;
			return  false;
		}

		glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

		glGenTextures(1, &textura);

		glBindTexture(GL_TEXTURE_2D, textura);

		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);

		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_NEAREST);

		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_NEAREST);

		glTexImage2D(GL_TEXTURE_2D, 0, cantColores, surface->w, surface->h, 0, formato,	GL_UNSIGNED_BYTE, surface->pixels);
		return true;
	} else {
		return  false;
	}
}

Textura::~Textura() {
	glDeleteTextures(1, &textura);
}

void Textura::bind(){
	if(textura != 0)
	glBindTexture (GL_TEXTURE_2D, textura);
}
